# coding: utf-8

'''
@author: Soraia Janeiro 6051
@author: Lenia Andrade 5607
@date: Junho 2013
@summary: Este modulo contem a classe Calculos
'''

import algorithm_library as biblioteca
import math
import time
import numpy as np

class Calculos:
	'''
    @summary: Esta classe efectua cálculos às execuções de cada algoritmo.
    '''
	
	def calcular_tempos(self,listaOrdenar,metodoEscolhido,numeroExecucoes):
		
		'''
		@summary: O metodo calcula os tempos de execução dos algoritmos.
		@param listaOrdenar: Lista que irá ser ordenada.
		@param metodoEscolhido: Algoritmo escolhido para executar.
		@param numeroExecucoes: Numero de vezes que o algoritmo  é executado.
		'''
		
		temposExecucao = []
		
		alg = biblioteca.Algorithm_library()
		
		if metodoEscolhido == "Bubble Sort":			
			for x in xrange(0,numeroExecucoes):
				tempo1 = time.time()
				alg.bubbleSort(list(listaOrdenar))
				tempo2 = time.time()
				temposExecucao.append(tempo2-tempo1)
				pass
			return temposExecucao
		
			
		elif metodoEscolhido == "Heap Sort":
			for x in xrange(0,numeroExecucoes):
				tempo1 = time.time()
				alg.heapsort(list(listaOrdenar))
				tempo2 = time.time()
				temposExecucao.append(tempo2-tempo1)
				pass
			return temposExecucao
			
		elif metodoEscolhido == "Insertion Sort":
			for x in xrange(0,numeroExecucoes):
				tempo1 = time.time()
				alg.insertionSort(list(listaOrdenar))
				tempo2 = time.time()
				temposExecucao.append(tempo2-tempo1)
				pass
			return temposExecucao
			
		elif metodoEscolhido == "Merge Sort":
			for x in xrange(0,numeroExecucoes):
				tempo1 = time.time()
				alg.mergeSort(list(listaOrdenar),0,len(listaOrdenar)-1)
				tempo2 = time.time()
				temposExecucao.append(tempo2-tempo1)
				pass
			return temposExecucao
			
		elif metodoEscolhido == "Quick Sort":
			for x in xrange(0,numeroExecucoes):
				tempo1 = time.time()
				alg.quicksort(list(listaOrdenar),0,len(listaOrdenar)-1)
				tempo2 = time.time()
				temposExecucao.append(tempo2-tempo1)
				pass
			return temposExecucao
			
		else:
			#nao faz nada
			pass	
		pass 
		
	def media(self,tempos):
		
		'''
		@summary: O metodo calcula a média de cada algoritmo.
		@param tempos: São os tempos guardados de cada execução do algortimo.
		@return: np.mean(tempos), a media.
		'''
		
		return np.mean(tempos)
		

	def desvio_padrao(self,tempos):
		
		'''
		@summary: O metodo calcula o desvio padrão de cada algoritmo.
		@param tempos: São os tempos guardados de cada execução do algortimo.
		@return: np.std(tempos), o desvio padrao.
		'''
		
		return np.std(tempos)


	def variancia(self,tempos):
		
		'''
		@summary: O metodo calcula a variancia.
		@param tempos: São os tempos guardados de cada execução do algortimo.
		@return: np.var(tempos), a variancia.
		'''
		
		return np.var(tempos)
	
	pass
'''
b = Calculos()
lista = [2,10,25,30,1,40,50,25,20,12]
b.calcular_tempos(lista,"Quick Sort",3)
'''	

